package com.tedu.api.ee;

import org.junit.jupiter.api.Test;

/**
 * Java有一套完善异常处理操作：
 * 程序中对应出现什么问题，就会有对应异常【对象】提供出来，错误也是对象！
 *
 * Throwable 顶级超类 -- 抛出错误：
 *     子类： Exception对象：程序级别的错误（经常遇见）
 *           编译器--FileOutputStream(编写代码同时，下方波浪线)
 *           处理方式：1.抛出异常：不管什么错误，抛出方法外
 *                   2.捕获异常：抓到异常，记录异常错误信息
 *           检查异常：通常由编译器检查出来，存在异常类，抛出，捕获异常
 *           运行期--控制台（IDE开发工具控制台，显示出红色，异常类名字）
 *           非检查异常：RuntimeException（认为所有异常来自RuntimeException）
 *                     所有异常都是RuntimeException的子类
 *
 *     子类： Error对象：描述系统级别的错误（不常见）
 *           ----测试：程序挂了？字符串  直接量写出字符串  ---存常量池
 */
public class EE {
    /**
     * Error错误 -- 递归方式栈溢出
     * 1.创建静态方法method
     * 2.在静态方法中调用method
     * 3.通过testError单元测试--调用EE对象下的method方法
     */
    public static void method(){
        method();
    }
    @Test
    public void testError(){
        String name="市委";
        for(int i=0;i<99L;){
            name=name+"1";
        }
    }
    @Test
    public void testException(){
        String s="a";
        //StringIndexOutOfBoundException异常--产生原因：字符串下标越界异常
        System.out.println(s.charAt(0));
    }
    //Exception 检查异常  ---处理手段2：捕获方式--预判：程序出什么异常
    /**
     *  捕获异常语法：
     *               try{
     *                   可能出现的异常代码段中添加
     *                   }catch(异常名字 e){
     *                   e.printStackTrace();
     *               }catch(异常名字【大异常】 e){
     *                   e.printStackTrace();
     *               }finally{
     *                   捕获异常---必须执行代码块--IO关闭流
     *               }
     */
    @Test
    public void testException1(){
        try {
            String s="a";
            //StringIndexOfBoundsException异常--字符下标越界异常
            // 产生原因，指定下标超出字符串范围
            //System.out.println(s.charAt(0));
            s.length();
            //NullPointerException异常---空指针异常
            //异常异常原因：字符串为空，拿到数据值位空时
            //s.length();

            //NumberFormatException异常---数值异常转换
            Integer.parseInt(s);//a 是整数类型
        } catch(NumberFormatException e) {//数值转换异常
            e.printStackTrace();//打印异常信息--提供线索
        }catch(NullPointerException e) {//空指针异常
            e.printStackTrace();//打印异常信息--提供线索
            }catch(StringIndexOutOfBoundsException e) {//下标越界异常
            e.printStackTrace();//打印异常信息--提供线索
        } finally{
            System.out.println("一定执行代码块");
        }
    }
}
